LyoqIEBmaWxlDQogIFNjYW5NZW04KCkgaW1wbGVtZW50YXRpb24uDQoNCiAgQ29weXJpZ2h0IChjKSAyMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbjxCUj4NCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UNCiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdA0KICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwDQoNCiAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsDQogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuDQoNCiAgTW9kdWxlIE5hbWU6ICBTY2FuTWVtOFdyYXBwZXIuYw0KDQogIFRoZSBmb2xsb3dpbmcgQmFzZU1lbW9yeUxpYiBpbnN0YW5jZXMgc2hhcmUgdGhlIHNhbWUgdmVyc2lvbiBvZiB0aGlzIGZpbGU6DQoNCiAgICBCYXNlTWVtb3J5TGliDQogICAgQmFzZU1lbW9yeUxpYk1teA0KICAgIEJhc2VNZW1vcnlMaWJTc2UyDQogICAgQmFzZU1lbW9yeUxpYlJlcFN0cg0KICAgIFBlaU1lbW9yeUxpYg0KICAgIFVlZmlNZW1vcnlMaWINCg0KKiovDQoNCiNpbmNsdWRlICJNZW1MaWJJbnRlcm5hbHMuaCINCg0KLyoqDQogIFNjYW5zIGEgdGFyZ2V0IGJ1ZmZlciBmb3IgYW4gOC1iaXQgdmFsdWUsIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWF0Y2hpbmcgOC1iaXQgdmFsdWUNCiAgaW4gdGhlIHRhcmdldCBidWZmZXIuDQoNCiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0YXJnZXQgdGhlIGJ1ZmZlciBzcGVjaWZpZWQgYnkgQnVmZmVyIGFuZCBMZW5ndGggZnJvbSB0aGUgbG93ZXN0DQogIGFkZHJlc3MgdG8gdGhlIGhpZ2hlc3QgYWRkcmVzcyBmb3IgYW4gOC1iaXQgdmFsdWUgdGhhdCBtYXRjaGVzIFZhbHVlLiAgSWYgYSBtYXRjaCBpcyBmb3VuZCwNCiAgdGhlbiBhIHBvaW50ZXIgdG8gdGhlIG1hdGNoaW5nIGJ5dGUgaW4gdGhlIHRhcmdldCBidWZmZXIgaXMgcmV0dXJuZWQuICBJZiBubyBtYXRjaCBpcyBmb3VuZCwNCiAgdGhlbiBOVUxMIGlzIHJldHVybmVkLiAgSWYgTGVuZ3RoIGlzIDAsIHRoZW4gTlVMTCBpcyByZXR1cm5lZC4NCiAgSWYgTGVuZ3RoID4gMCBhbmQgQnVmZmVyIGlzIE5VTEwsIHRoZW4gQVNTRVJUKCkuDQogIElmIExlbmd0aCBpcyBncmVhdGVyIHRoYW4gKE1BWF9BRERSRVNTIJYgQnVmZmVyICsgMSksIHRoZW4gQVNTRVJUKCkuIA0KDQogIEBwYXJhbSAgQnVmZmVyICAgICAgUG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1ZmZlciB0byBzY2FuLg0KICBAcGFyYW0gIExlbmd0aCAgICAgIE51bWJlciBvZiBieXRlcyBpbiBCdWZmZXIgdG8gc2Nhbi4NCiAgQHBhcmFtICBWYWx1ZSAgICAgICBWYWx1ZSB0byBzZWFyY2ggZm9yIGluIHRoZSB0YXJnZXQgYnVmZmVyLg0KDQogIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBtYXRjaGluZyBieXRlIGluIHRoZSB0YXJnZXQgYnVmZmVyIG9yIE5VTEwgb3RoZXJ3aXNlLg0KDQoqKi8NClZPSUQgKg0KRUZJQVBJDQpTY2FuTWVtOCAoDQogIElOIENPTlNUIFZPSUQgICpCdWZmZXIsDQogIElOIFVJTlROICAgICAgIExlbmd0aCwNCiAgSU4gVUlOVDggICAgICAgVmFsdWUNCiAgKQ0Kew0KICBpZiAoTGVuZ3RoID09IDApIHsNCiAgICByZXR1cm4gTlVMTDsNCiAgfQ0KICBBU1NFUlQgKEJ1ZmZlciAhPSBOVUxMKTsNCiAgQVNTRVJUICgoTGVuZ3RoIC0gMSkgPD0gKE1BWF9BRERSRVNTIC0gKFVJTlROKUJ1ZmZlcikpOw0KIA0KICByZXR1cm4gKFZPSUQqKUludGVybmFsTWVtU2Nhbk1lbTggKEJ1ZmZlciwgTGVuZ3RoLCBWYWx1ZSk7DQp9DQo=