LyoKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgRG1pdHJ5IFN0YWRuaWsgKEJvcmxhbmQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgIEFsZXhhbmRlciBTaGF0YWxpbiAoQm9ybGFuZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICovCgqrSU1QT1JUICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA4L0dlbk1vZGVsIrsKCqtERUZJTkUgTWFpbiBGT1IgZ21mZ2VuOjpHZW5MaW5rTGFiZWwtuwqrRVhQQU5EIHhwdDo6Q29tbW9uOjpjb3B5cmlnaHQgRk9SIGdldERpYWdyYW0oKS5lZGl0b3JHZW4tuwpwYWNrYWdlIKtnZXREaWFncmFtKCkuZWRpdFBhcnRzUGFja2FnZU5hbWW7OwoKq0VYUEFORCB4cHQ6OkNvbW1vbjo6Z2VuZXJhdGVkQ2xhc3NDb21tZW50uwpwdWJsaWMgY2xhc3Mgq2VkaXRQYXJ0Q2xhc3NOYW1luyCrRVhQQU5EIGV4dGVuZHNMaXN0uyCrRVhQQU5EIGltcGxlbWVudHNMaXN0uyB7CgoJq0VYUEFORCBhdHRyaWJ1dGVzLbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OkxpbmtMYWJlbEVkaXRQYXJ0Ojppbml0aWFsaXplci27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpMaW5rTGFiZWxFZGl0UGFydDo6Y29uc3RydWN0b3ItuwoJCgmrRVhQQU5EIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6TGlua0xhYmVsRWRpdFBhcnQ6OmdldEtleVBvaW50LbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OlRleHRBd2FyZTo6bWV0aG9kcyhmYWxzZSwgcmVhZE9ubHksIGVsZW1lbnRJY29uLCB2aWV3bWFwLCBtb2RlbEZhY2V0LCBsaW5rLCBnZXREaWFncmFtKCkpLbsKCQoJq0VYUEFORCBoYW5kbGVOb3RpZmljYXRpb25FdmVudC27CgkKCatFWFBBTkQgeHB0OjpkaWFncmFtOjplZGl0cGFydHM6OkNvbW1vbjo6bGFiZWxGaWd1cmUgRk9SIHZpZXdtYXAtuwoKCatFWFBBTkQgYWRkaXRpb25zLbsKfQqrRU5EREVGSU5FuwoKq0RFRklORSBleHRlbmRzTGlzdCBGT1IgZ21mZ2VuOjpHZW5MaW5rTGFiZWy7ZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0q0VORERFRklORbsKCqtERUZJTkUgaW1wbGVtZW50c0xpc3QgRk9SIGdtZmdlbjo6R2VuTGlua0xhYmVsu2ltcGxlbWVudHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0q0VORERFRklORbsKCqtERUZJTkUgYXR0cmlidXRlcyBGT1IgZ21mZ2VuOjpHZW5MaW5rTGFiZWwtuwoJq0VYUEFORCB4cHQ6OmRpYWdyYW06OmVkaXRwYXJ0czo6Q29tbW9uOjp2aXN1YWxJRENvbnN0YW50LbsKCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6VGV4dEF3YXJlOjpmaWVsZHMtuwqrRU5EREVGSU5FuwoKq0RFRklORSBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzIEZPUiBnbWZnZW46OkdlbkxpbmtMYWJlbC27CgmrRVhQQU5EIHhwdDo6Q29tbW9uOjpnZW5lcmF0ZWRNZW1iZXJDb21tZW50uwoJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKCQmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6TGlua0xhYmVsRWRpdFBhcnQ6OmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXNCb2R5LbsKCX0Kq0VORERFRklORbsKCqtERUZJTkUgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQgRk9SIGdtZmdlbjo6R2VuTGlua0xhYmVsLbsKCatFWFBBTkQgeHB0OjpDb21tb246OmdlbmVyYXRlZE1lbWJlckNvbW1lbnS7Cglwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gZXZlbnQpIHsKCQmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6TGlua0xhYmVsRWRpdFBhcnQ6OmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50Qm9keS27Cgl9CqtFTkRERUZJTkW7CgqrREVGSU5FIGFkZGl0aW9ucyBGT1IgZ21mZ2VuOjpHZW5MaW5rTGFiZWwtuwqrRU5EREVGSU5Fuw==