LyoKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgRG1pdHJ5IFN0YWRuaWsgKEJvcmxhbmQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgIEFsZXhhbmRlciBTaGF0YWxpbiAoQm9ybGFuZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICovCgqrSU1QT1JUICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA4L0dlbk1vZGVsIrsKCqtERUZJTkUgTWFpbiBGT1IgZ21mZ2VuOjpHZW5DaGlsZExhYmVsTm9kZS27CqtFWFBBTkQgeHB0OjpDb21tb246OmNvcHlyaWdodCBGT1IgZ2V0RGlhZ3JhbSgpLmVkaXRvckdlbi27CnBhY2thZ2Ugq2dldERpYWdyYW0oKS5lZGl0UGFydHNQYWNrYWdlTmFtZbs7CgqrRVhQQU5EIHhwdDo6Q29tbW9uOjpnZW5lcmF0ZWRDbGFzc0NvbW1lbnS7CnB1YmxpYyBjbGFzcyCrZWRpdFBhcnRDbGFzc05hbWW7IKtFWFBBTkQgZXh0ZW5kc0xpc3S7IKtFWFBBTkQgaW1wbGVtZW50c0xpc3S7IHsKCQoJq0VYUEFORCBhdHRyaWJ1dGVzLbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OkNoaWxkTm9kZUxhYmVsRWRpdFBhcnQ6OmNvbnRzcnVjdG9yLbsKCgmrRVhQQU5EIGdldERyYWdUcmFja2VyLbsKCQoJq0VYUEFORCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzLbsKCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6VGV4dEF3YXJlOjptZXRob2RzKGZhbHNlLCBsYWJlbFJlYWRPbmx5LCBsYWJlbEVsZW1lbnRJY29uLCB2aWV3bWFwLCBsYWJlbE1vZGVsRmFjZXQsIHRoaXMsIGdldERpYWdyYW0oKSkgRk9SIHRoaXMtuwoKCatFWFBBTkQgeHB0OjpkaWFncmFtOjplZGl0cGFydHM6OkNvbW1vbjo6bm90YXRpb25hbExpc3RlbmVycyBGT1IgdGhpcy27CgkKCatFWFBBTkQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQtuwoKCatFWFBBTkQgeHB0OjpkaWFncmFtOjplZGl0cGFydHM6OkNvbW1vbjo6bGFiZWxGaWd1cmUgRk9SIHZpZXdtYXAtuwoJCgmrRVhQQU5EIGFkZGl0aW9ucy27Cn0Kq0VORERFRklORbsKCqtERUZJTkUgZXh0ZW5kc0xpc3QgRk9SIGdtZmdlbjo6R2VuQ2hpbGRMYWJlbE5vZGW7ZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0q0VORERFRklORbsKCqtERUZJTkUgaW1wbGVtZW50c0xpc3QgRk9SIGdtZmdlbjo6R2VuQ2hpbGRMYWJlbE5vZGW7aW1wbGVtZW50cyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnSrRU5EREVGSU5FuwoKq0RFRklORSBhdHRyaWJ1dGVzIEZPUiBnbWZnZW46OkdlbkNoaWxkTGFiZWxOb2RlLbsKCatFWFBBTkQgeHB0OjpkaWFncmFtOjplZGl0cGFydHM6OkNvbW1vbjo6dmlzdWFsSURDb25zdGFudCBGT1IgdGhpcy27CgoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OlRleHRBd2FyZTo6ZmllbGRzIEZPUiB0aGlzLbsKq0VORERFRklORbsKCqtERUZJTkUgZ2V0RHJhZ1RyYWNrZXIgRk9SIGdtZmdlbjo6R2VuQ2hpbGRMYWJlbE5vZGUtuwoJq0VYUEFORCB4cHQ6OkNvbW1vbjo6Z2VuZXJhdGVkTWVtYmVyQ29tbWVudLsKcHVibGljIG9yZy5lY2xpcHNlLmdlZi5EcmFnVHJhY2tlciBnZXREcmFnVHJhY2tlcihvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCByZXF1ZXN0KSB7CgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Q2hpbGROb2RlTGFiZWxFZGl0UGFydDo6Z2V0RHJhZ1RyYWNrZXJCb2R5LbsKfQqrRU5EREVGSU5FuwoKq0RFRklORSBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzIEZPUiBnbWZnZW46OkdlbkNoaWxkTGFiZWxOb2RlLbsKCatFWFBBTkQgeHB0OjpDb21tb246OmdlbmVyYXRlZE1lbWJlckNvbW1lbnS7CnByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7CgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Q2hpbGROb2RlTGFiZWxFZGl0UGFydDo6Y3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llc0JvZHktuwp9CqtFTkRERUZJTkW7CgqrREVGSU5FIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50IEZPUiBnbWZnZW46OkdlbkNoaWxkTGFiZWxOb2RlLbsKCatFWFBBTkQgeHB0OjpDb21tb246OmdlbmVyYXRlZE1lbWJlckNvbW1lbnS7CnByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBldmVudCkgewoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OkNoaWxkTm9kZUxhYmVsRWRpdFBhcnQ6OmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50Qm9keS27Cn0Kq0VORERFRklORbsKCqtERUZJTkUgYWRkaXRpb25zIEZPUiBnbWZnZW46OkdlbkNoaWxkTGFiZWxOb2Rlu6tFTkRERUZJTkW7