LyoKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgRG1pdHJ5IFN0YWRuaWsgKEJvcmxhbmQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqLwoKq0lNUE9SVCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwOC9HZW5Nb2RlbCK7CqtJTVBPUlQgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiuwqrSU1QT1JUICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIrsKq0VYVEVOU0lPTiB4cHQ6Okdlbk1vZGVsVXRpbHO7CgqrREVGSU5FIGNvcHlyaWdodCBGT1IgZ21mZ2VuOjpHZW5FZGl0b3JHZW5lcmF0b3ItuwqrSUYgY29weXJpZ2h0VGV4dCAhPSBudWxsLbsKLyoKICogq2NvcHlyaWdodFRleHQucmVwbGFjZUFsbCgiXG4iLCAiXG4gKiAiKbsKICovCqtFTkRJRi27CqtFTkRERUZJTkW7CgqrREVGSU5FIHhjb3B5cmlnaHQgRk9SIGdtZmdlbjo6R2VuRWRpdG9yR2VuZXJhdG9yLbsKq0lGIGNvcHlyaWdodFRleHQgIT0gbnVsbC27CjwhLS0Kq2NvcHlyaWdodFRleHS7Ci0tPgqrRU5ESUYtuwqrRU5EREVGSU5FuwoKq0RFRklORSBnZW5lcmF0ZWRDbGFzc0NvbW1lbnQgRk9SIE9iamVjdC27CgmrRVhQQU5EIGdlbmVyYXRlZENsYXNzQ29tbWVudCgiIiktuwqrRU5EREVGSU5FuwogCqtERUZJTkUgZ2VuZXJhdGVkQ2xhc3NDb21tZW50KFN0cmluZyBjb21tZW50KSBGT1IgT2JqZWN0LbsKLyoqCqtJRiBjb21tZW50Lmxlbmd0aCgpID4gMC27CiAqIKtjb21tZW50LnJlcGxhY2VBbGwoIlxuIiwgIlxuICogIim7CqtFTkRJRi27CiAqIEBnZW5lcmF0ZWQKICovq0VORERFRklORbsKCqtERUZJTkUgZ2VuZXJhdGVkTWVtYmVyQ29tbWVudCBGT1IgT2JqZWN0LbsKCatFWFBBTkQgZ2VuZXJhdGVkTWVtYmVyQ29tbWVudCgiIiktuwqrRU5EREVGSU5FuwogCqtERUZJTkUgZ2VuZXJhdGVkTWVtYmVyQ29tbWVudChTdHJpbmcgY29tbWVudCkgRk9SIE9iamVjdC27Ci8qKgqrSUYgY29tbWVudC5sZW5ndGgoKSA+IDAtuwogKiCrY29tbWVudC5yZXBsYWNlQWxsKCJcbiIsICJcbiAqICIpuwqrRU5ESUYtuwogKiBAZ2VuZXJhdGVkCiAqL6tFTkRERUZJTkW7CgqrREVGSU5FIHhtbEdlbmVyYXRlZFRhZyBGT1IgT2JqZWN0uzw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PqtFTkRERUZJTkW7CgqrREVGSU5FIGdldFNhdmVPcHRpb25zIEZPUiBnbWZnZW46OkdlbkRpYWdyYW27q2dldERpYWdyYW1FZGl0b3JVdGlsUXVhbGlmaWVkQ2xhc3NOYW1lKCm7LmdldFNhdmVPcHRpb25zKCmrRU5EREVGSU5FuwoKq0RFRklORSBzZXRDaGFyc2V0KFN0cmluZyB2YXJOYW1lKSBGT1IgZ21mZ2VuOjpHZW5EaWFncmFtLbsKq2dldERpYWdyYW1FZGl0b3JVdGlsUXVhbGlmaWVkQ2xhc3NOYW1lKCm7LnNldENoYXJzZXQoq3Zhck5hbWW7KTsKq0VORERFRklORbsKCqtERUZJTkUgbm9uTkxTIEZPUiBPYmplY3S7q0VYUEFORCBub25OTFMoMSm7q0VORERFRklORbsKCqtERUZJTkUgbm9uTkxTKENvbGxlY3Rpb25bT2JqZWN0XSBpbmRleGVzKSBGT1IgT2JqZWN0uyCrRVhQQU5EIG5vbk5MUyhpbmRleGVzLmFkZCh0aGlzKS5zaXplKCkpu6tFTkRERUZJTkW7CgqrREVGSU5FIG5vbk5MUyhpbnQgaSkgRk9SIE9iamVjdLsvLyROT04tTkxTLatpuySrRU5EREVGSU5FuwoKq0RFRklORSBjYXNlVmlzdWFsSUQgRk9SIGdtZmdlbjo6R2VuQ29tbW9uQmFzZbtjYXNlIKtFWFBBTkQgeHB0OjplZGl0b3I6OlZpc3VhbElEUmVnaXN0cnk6OnZpc3VhbElEuzqrRU5EREVGSU5FuwoKq0RFRklORSBhZGRTaG9ydGN1dEFubm90YXRpb24oU3RyaW5nIHZpZXdWYXIpIEZPUiBnbWZnZW46OkdlbkRpYWdyYW0tuwoJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVBbm5vdGF0aW9uKCk7CglzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyCrRVhQQU5EIHhwdDo6Q29tbW9uOjpub25OTFO7CglzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgibW9kZWxJRCIsIKtnZXRFZGl0UGFydFF1YWxpZmllZENsYXNzTmFtZSgpuy5NT0RFTF9JRCk7IKtFWFBBTkQgeHB0OjpDb21tb246Om5vbk5MU7sKCat2aWV3VmFyuy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKq0VORERFRklORbsK