LyoqCiAqIDxjb3B5cmlnaHQ+CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogKiAKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIDwvY29weXJpZ2h0PgogKgogKiAkSWQ6IFNlcnZlclR5cGVQYWNrYWdlSW1wbC5qYXZhLHYgMS4yIDIwMDUvMDMvMjcgMTI6NTU6MzYgZ2VyY2FuIEV4cCAkCiAqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CgppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVQYWNrYWdlSW1wbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpUHJvcGVydHk7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHk7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZUZhY3Rvcnk7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwoKLyoqCiAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAqIEBnZW5lcmF0ZWQKICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBTZXJ2ZXJUeXBlUGFja2FnZSB7CiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHJpdmF0ZSBFQ2xhc3MgYXJjaGl2ZVR5cGVFQ2xhc3MgPSBudWxsOwoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwcml2YXRlIEVDbGFzcyBjbGFzc3BhdGhFQ2xhc3MgPSBudWxsOwoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwcml2YXRlIEVDbGFzcyBqbmRpQ29ubmVjdGlvbkVDbGFzcyA9IG51bGw7CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHByaXZhdGUgRUNsYXNzIGpuZGlQcm9wZXJ0eUVDbGFzcyA9IG51bGw7CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXByaXZhdGUgRUNsYXNzIGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwcml2YXRlIEVDbGFzcyBtb2R1bGVFQ2xhc3MgPSBudWxsOwoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwcml2YXRlIEVDbGFzcyBwb3J0RUNsYXNzID0gbnVsbDsKCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHJpdmF0ZSBFQ2xhc3MgcHJvamVjdEVDbGFzcyA9IG51bGw7CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXByaXZhdGUgRUNsYXNzIHByb3BlcnR5RUNsYXNzID0gbnVsbDsKCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHJpdmF0ZSBFQ2xhc3MgcHVibGlzaGVyRUNsYXNzID0gbnVsbDsKCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHJpdmF0ZSBFQ2xhc3MgcHVibGlzaGVyRGF0YUVDbGFzcyA9IG51bGw7CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXByaXZhdGUgRUNsYXNzIHNlcnZlclJ1bnRpbWVFQ2xhc3MgPSBudWxsOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAogICAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKICAgICAqIHBhY2thZ2UgVVJJIHZhbHVlLgogICAgICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwogICAgICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKICAgICAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCiAgICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQogICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2VOU19VUkkKICAgICAqIEBzZWUgI2luaXQoKQogICAgICogQGdlbmVyYXRlZAogICAgICovCglwcml2YXRlIFNlcnZlclR5cGVQYWNrYWdlSW1wbCgpIHsKICAgICAgICBzdXBlcihlTlNfVVJJLCBTZXJ2ZXJUeXBlRmFjdG9yeS5lSU5TVEFOQ0UpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKICAgICAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCiAgICAgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAogICAgICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCiAgICAgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCiAgICAgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgogICAgICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAogICAgICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCiAgICAgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6CiAgICAgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQogICAgICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KICAgICAqIHRob3NlIG9mIGFub3RoZXIuCiAgICAgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCiAgICAgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAc2VlICNlTlNfVVJJCiAgICAgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQogICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBzdGF0aWMgU2VydmVyVHlwZVBhY2thZ2UgaW5pdCgpIHsKICAgICAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoU2VydmVyVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2VydmVyVHlwZVBhY2thZ2UuZU5TX1VSSSk7CgogICAgICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKICAgICAgICBTZXJ2ZXJUeXBlUGFja2FnZUltcGwgdGhlU2VydmVyVHlwZVBhY2thZ2UgPSAoU2VydmVyVHlwZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFNlcnZlclR5cGVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFNlcnZlclR5cGVQYWNrYWdlSW1wbCgpKTsKCiAgICAgICAgaXNJbml0ZWQgPSB0cnVlOwoKICAgICAgICAvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKICAgICAgICBYTUxUeXBlUGFja2FnZUltcGwuaW5pdCgpOwoKICAgICAgICAvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwogICAgICAgIHRoZVNlcnZlclR5cGVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwoKICAgICAgICAvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCiAgICAgICAgdGhlU2VydmVyVHlwZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwoKICAgICAgICAvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAgICAgICAgdGhlU2VydmVyVHlwZVBhY2thZ2UuZnJlZXplKCk7CgogICAgICAgIHJldHVybiB0aGVTZXJ2ZXJUeXBlUGFja2FnZTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVDbGFzcyBnZXRBcmNoaXZlVHlwZSgpIHsKICAgICAgICByZXR1cm4gYXJjaGl2ZVR5cGVFQ2xhc3M7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyY2hpdmVUeXBlX1BhdGgoKSB7CiAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWFyY2hpdmVUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQ2xhc3MgZ2V0Q2xhc3NwYXRoKCkgewogICAgICAgIHJldHVybiBjbGFzc3BhdGhFQ2xhc3M7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENsYXNzcGF0aF9Hcm91cCgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY2xhc3NwYXRoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFUmVmZXJlbmNlIGdldENsYXNzcGF0aF9BcmNoaXZlKCkgewogICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSljbGFzc3BhdGhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoX0lkKCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljbGFzc3BhdGhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoX0lzTGlicmFyeSgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY2xhc3NwYXRoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFQ2xhc3MgZ2V0Sm5kaUNvbm5lY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGpuZGlDb25uZWN0aW9uRUNsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Qcm92aWRlclVybCgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpam5kaUNvbm5lY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fR3JvdXAoKSB7CiAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWpuZGlDb25uZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEpuZGlDb25uZWN0aW9uX0puZGlQcm9wZXJ0eSgpIHsKICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upam5kaUNvbm5lY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fSW5pdGlhbENvbnRleHRGYWN0b3J5KCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqbmRpQ29ubmVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgRUNsYXNzIGdldEpuZGlQcm9wZXJ0eSgpIHsKICAgICAgICByZXR1cm4gam5kaVByb3BlcnR5RUNsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKbmRpUHJvcGVydHlfTmFtZSgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpam5kaVByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEpuZGlQcm9wZXJ0eV9WYWx1ZSgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpam5kaVByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQ2xhc3MgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpIHsKICAgICAgICByZXR1cm4gbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzczsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9NYWluQ2xhc3MoKSB7CiAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Xb3JraW5nRGlyZWN0b3J5KCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fUHJvZ3JhbUFyZ3VtZW50cygpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0NsYXNzcGF0aFJlZmVyZW5jZSgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUNsYXNzIGdldE1vZHVsZSgpIHsKICAgICAgICByZXR1cm4gbW9kdWxlRUNsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfVHlwZSgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9QdWJsaXNoRGlyKCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX1B1Ymxpc2hlclJlZmVyZW5jZSgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQ2xhc3MgZ2V0UG9ydCgpIHsKICAgICAgICByZXR1cm4gcG9ydEVDbGFzczsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydF9ObygpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X05hbWUoKSB7CiAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydF9Qcm90b2NvbCgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUNsYXNzIGdldFByb2plY3QoKSB7CiAgICAgICAgcmV0dXJuIHByb2plY3RFQ2xhc3M7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ2xhc3NwYXRoUmVmZXJlbmNlKCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlwcm9qZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvcGVydHkoKSB7CiAgICAgICAgcmV0dXJuIHByb3BlcnR5RUNsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9Db250ZXh0KCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9EZWZhdWx0KCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9JZCgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfTGFiZWwoKSB7CiAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X1R5cGUoKSB7CiAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQ2xhc3MgZ2V0UHVibGlzaGVyKCkgewogICAgICAgIHJldHVybiBwdWJsaXNoZXJFQ2xhc3M7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFB1Ymxpc2hlcl9Hcm91cCgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpcHVibGlzaGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFB1Ymxpc2hlcl9QdWJsaXNoZXJkYXRhKCkgewogICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlwdWJsaXNoZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyX0lkKCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIEVDbGFzcyBnZXRQdWJsaXNoZXJEYXRhKCkgewogICAgICAgIHJldHVybiBwdWJsaXNoZXJEYXRhRUNsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmVyUnVudGltZSgpIHsKICAgICAgICByZXR1cm4gc2VydmVyUnVudGltZUVDbGFzczsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCkgewogICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAxKCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfUG9ydCgpIHsKICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMigpIHsKICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpIHsKICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1Byb2plY3QoKSB7CiAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9TdGFydCgpIHsKICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1N0b3AoKSB7CiAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDMoKSB7CiAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9QdWJsaXNoZXIoKSB7CiAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpIHsKICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpIHsKICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9OYW1lKCkgewogICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwogICAgfQoKICAgIC8qKgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX1ZlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyBTZXJ2ZXJUeXBlRmFjdG9yeSBnZXRTZXJ2ZXJUeXBlRmFjdG9yeSgpIHsKICAgICAgICByZXR1cm4gKFNlcnZlclR5cGVGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCiAgICAgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKICAgICAgICBpZiAoaXNDcmVhdGVkKSByZXR1cm47CiAgICAgICAgaXNDcmVhdGVkID0gdHJ1ZTsKCiAgICAgICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCiAgICAgICAgYXJjaGl2ZVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJDSElWRV9UWVBFKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGFyY2hpdmVUeXBlRUNsYXNzLCBBUkNISVZFX1RZUEVfX1BBVEgpOwoKICAgICAgICBjbGFzc3BhdGhFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0xBU1NQQVRIKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGNsYXNzcGF0aEVDbGFzcywgQ0xBU1NQQVRIX19HUk9VUCk7CiAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShjbGFzc3BhdGhFQ2xhc3MsIENMQVNTUEFUSF9fQVJDSElWRSk7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjbGFzc3BhdGhFQ2xhc3MsIENMQVNTUEFUSF9fSUQpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY2xhc3NwYXRoRUNsYXNzLCBDTEFTU1BBVEhfX0lTX0xJQlJBUlkpOwoKICAgICAgICBqbmRpQ29ubmVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKTkRJX0NPTk5FQ1RJT04pOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fUFJPVklERVJfVVJMKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGpuZGlDb25uZWN0aW9uRUNsYXNzLCBKTkRJX0NPTk5FQ1RJT05fX0dST1VQKTsKICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGpuZGlDb25uZWN0aW9uRUNsYXNzLCBKTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFkpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkpOwoKICAgICAgICBqbmRpUHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSk5ESV9QUk9QRVJUWSk7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqbmRpUHJvcGVydHlFQ2xhc3MsIEpORElfUFJPUEVSVFlfX05BTUUpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoam5kaVByb3BlcnR5RUNsYXNzLCBKTkRJX1BST1BFUlRZX19WQUxVRSk7CgogICAgICAgIGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTEFVTkNIX0NPTkZJR1VSQVRJT04pOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUyk7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fVk1fUEFSQU1FVEVSUyk7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRSk7CgogICAgICAgIG1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RVTEUpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX1RZUEUpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX1BVQkxJU0hfRElSKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFKTsKCiAgICAgICAgcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRFQ2xhc3MsIFBPUlRfX05PKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRFQ2xhc3MsIFBPUlRfX05BTUUpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocG9ydEVDbGFzcywgUE9SVF9fUFJPVE9DT0wpOwoKICAgICAgICBwcm9qZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0pFQ1QpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocHJvamVjdEVDbGFzcywgUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRSk7CgogICAgICAgIHByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST1BFUlRZKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fQ09OVEVYVCk7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX0RFRkFVTFQpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19JRCk7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX0xBQkVMKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fVFlQRSk7CgogICAgICAgIHB1Ymxpc2hlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVUJMSVNIRVIpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocHVibGlzaGVyRUNsYXNzLCBQVUJMSVNIRVJfX0dST1VQKTsKICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHB1Ymxpc2hlckVDbGFzcywgUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHB1Ymxpc2hlckVDbGFzcywgUFVCTElTSEVSX19JRCk7CgogICAgICAgIHB1Ymxpc2hlckRhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFVCTElTSEVSX0RBVEEpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocHVibGlzaGVyRGF0YUVDbGFzcywgUFVCTElTSEVSX0RBVEFfX0RBVEFOQU1FKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHB1Ymxpc2hlckRhdGFFQ2xhc3MsIFBVQkxJU0hFUl9EQVRBX19EQVRBVkFMVUUpOwoKICAgICAgICBzZXJ2ZXJSdW50aW1lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZFUl9SVU5USU1FKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19HUk9VUCk7CiAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fUFJPUEVSVFkpOwogICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0dST1VQMSk7CiAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fUE9SVCk7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fR1JPVVAyKTsKICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19NT0RVTEUpOwogICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QpOwogICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1NUQVJUKTsKICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19TVE9QKTsKICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19HUk9VUDMpOwogICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUik7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fR1JPVVA0KTsKICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEgpOwogICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTik7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fTkFNRSk7CiAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fVkVSU0lPTik7CiAgICB9CgogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgICAgKiBAZ2VuZXJhdGVkCiAgICAgKi8KCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwogICAgICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwoJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKICAgICAgICBpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOwoKICAgICAgICAvLyBJbml0aWFsaXplIHBhY2thZ2UKICAgICAgICBzZXROYW1lKGVOQU1FKTsKICAgICAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKICAgICAgICBzZXROc1VSSShlTlNfVVJJKTsKCiAgICAgICAgLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwogICAgICAgIFhNTFR5cGVQYWNrYWdlSW1wbCB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7CgogICAgICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKICAgICAgICBpbml0RUNsYXNzKGFyY2hpdmVUeXBlRUNsYXNzLCBBcmNoaXZlVHlwZS5jbGFzcywgIkFyY2hpdmVUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldEFyY2hpdmVUeXBlX1BhdGgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYXRoIiwgbnVsbCwgMCwgMSwgQXJjaGl2ZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwoKICAgICAgICBpbml0RUNsYXNzKGNsYXNzcGF0aEVDbGFzcywgQ2xhc3NwYXRoLmNsYXNzLCAiQ2xhc3NwYXRoIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldENsYXNzcGF0aF9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgQ2xhc3NwYXRoLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRDbGFzc3BhdGhfQXJjaGl2ZSgpLCB0aGlzLmdldEFyY2hpdmVUeXBlKCksIG51bGwsICJhcmNoaXZlIiwgbnVsbCwgMSwgLTEsIENsYXNzcGF0aC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDbGFzc3BhdGhfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIENsYXNzcGF0aC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q2xhc3NwYXRoX0lzTGlicmFyeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc0xpYnJhcnkiLCBudWxsLCAwLCAxLCBDbGFzc3BhdGguY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CgogICAgICAgIGluaXRFQ2xhc3Moam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAiSm5kaUNvbm5lY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Sm5kaUNvbm5lY3Rpb25fUHJvdmlkZXJVcmwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm92aWRlclVybCIsIG51bGwsIDEsIDEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKbmRpQ29ubmVjdGlvbl9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgSm5kaUNvbm5lY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEpuZGlDb25uZWN0aW9uX0puZGlQcm9wZXJ0eSgpLCB0aGlzLmdldEpuZGlQcm9wZXJ0eSgpLCBudWxsLCAiam5kaVByb3BlcnR5IiwgbnVsbCwgMCwgLTEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldEpuZGlDb25uZWN0aW9uX0luaXRpYWxDb250ZXh0RmFjdG9yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImluaXRpYWxDb250ZXh0RmFjdG9yeSIsIG51bGwsIDEsIDEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKCiAgICAgICAgaW5pdEVDbGFzcyhqbmRpUHJvcGVydHlFQ2xhc3MsIEpuZGlQcm9wZXJ0eS5jbGFzcywgIkpuZGlQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKbmRpUHJvcGVydHlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBKbmRpUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldEpuZGlQcm9wZXJ0eV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMSwgMSwgSm5kaVByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKCiAgICAgICAgaW5pdEVDbGFzcyhsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAiTGF1bmNoQ29uZmlndXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX01haW5DbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1haW5DbGFzcyIsIG51bGwsIDEsIDEsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtpbmdEaXJlY3RvcnkiLCBudWxsLCAxLCAxLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX1Byb2dyYW1Bcmd1bWVudHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9ncmFtQXJndW1lbnRzIiwgbnVsbCwgMSwgMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9WbVBhcmFtZXRlcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2bVBhcmFtZXRlcnMiLCBudWxsLCAxLCAxLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX0NsYXNzcGF0aFJlZmVyZW5jZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNsYXNzcGF0aFJlZmVyZW5jZSIsIG51bGwsIDEsIDEsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwoKICAgICAgICBpbml0RUNsYXNzKG1vZHVsZUVDbGFzcywgTW9kdWxlLmNsYXNzLCAiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9UeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidHlwZSIsIG51bGwsIDEsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX1B1Ymxpc2hEaXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwdWJsaXNoRGlyIiwgbnVsbCwgMSwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVibGlzaGVyUmVmZXJlbmNlIiwgbnVsbCwgMSwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKCiAgICAgICAgaW5pdEVDbGFzcyhwb3J0RUNsYXNzLCBQb3J0LmNsYXNzLCAiUG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05vKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibm8iLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgUG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydF9Qcm90b2NvbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb3RvY29sIiwgbnVsbCwgMSwgMSwgUG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CgogICAgICAgIGluaXRFQ2xhc3MocHJvamVjdEVDbGFzcywgUHJvamVjdC5jbGFzcywgIlByb2plY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzc3BhdGhSZWZlcmVuY2UiLCBudWxsLCAxLCAxLCBQcm9qZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKCiAgICAgICAgaW5pdEVDbGFzcyhwcm9wZXJ0eUVDbGFzcywgUHJvcGVydHkuY2xhc3MsICJQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9Db250ZXh0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29udGV4dCIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9EZWZhdWx0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVmYXVsdCIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5X0xhYmVsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibGFiZWwiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CgogICAgICAgIGluaXRFQ2xhc3MocHVibGlzaGVyRUNsYXNzLCBQdWJsaXNoZXIuY2xhc3MsICJQdWJsaXNoZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0UHVibGlzaGVyX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBQdWJsaXNoZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFB1Ymxpc2hlcl9QdWJsaXNoZXJkYXRhKCksIHRoaXMuZ2V0UHVibGlzaGVyRGF0YSgpLCBudWxsLCAicHVibGlzaGVyZGF0YSIsIG51bGwsIDEsIC0xLCBQdWJsaXNoZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0UHVibGlzaGVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBQdWJsaXNoZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwoKICAgICAgICBpbml0RUNsYXNzKHB1Ymxpc2hlckRhdGFFQ2xhc3MsIFB1Ymxpc2hlckRhdGEuY2xhc3MsICJQdWJsaXNoZXJEYXRhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldFB1Ymxpc2hlckRhdGFfRGF0YW5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkYXRhbmFtZSIsIG51bGwsIDEsIDEsIFB1Ymxpc2hlckRhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGF0YXZhbHVlIiwgbnVsbCwgMSwgMSwgUHVibGlzaGVyRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CgogICAgICAgIGluaXRFQ2xhc3Moc2VydmVyUnVudGltZUVDbGFzcywgU2VydmVyUnVudGltZS5jbGFzcywgIlNlcnZlclJ1bnRpbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9Qcm9wZXJ0eSgpLCB0aGlzLmdldFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZlclJ1bnRpbWVfR3JvdXAxKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDEiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9Qb3J0KCksIHRoaXMuZ2V0UG9ydCgpLCBudWxsLCAicG9ydCIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZlclJ1bnRpbWVfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9Nb2R1bGUoKSwgdGhpcy5nZXRNb2R1bGUoKSwgbnVsbCwgIm1vZHVsZSIsIG51bGwsIDEsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfUHJvamVjdCgpLCB0aGlzLmdldFByb2plY3QoKSwgbnVsbCwgInByb2plY3QiLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfU3RhcnQoKSwgdGhpcy5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCksIG51bGwsICJzdGFydCIsIG51bGwsIDEsIDEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9TdG9wKCksIHRoaXMuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpLCBudWxsLCAic3RvcCIsIG51bGwsIDEsIDEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX1B1Ymxpc2hlcigpLCB0aGlzLmdldFB1Ymxpc2hlcigpLCBudWxsLCAicHVibGlzaGVyIiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cDQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwNCIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpLCB0aGlzLmdldENsYXNzcGF0aCgpLCBudWxsLCAiY2xhc3NwYXRoIiwgbnVsbCwgMSwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpLCB0aGlzLmdldEpuZGlDb25uZWN0aW9uKCksIG51bGwsICJqbmRpQ29ubmVjdGlvbiIsIG51bGwsIDEsIDEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKCiAgICAgICAgLy8gQ3JlYXRlIHJlc291cmNlCiAgICAgICAgY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CgogICAgICAgIC8vIENyZWF0ZSBhbm5vdGF0aW9ucwogICAgICAgIC8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQogICAgICAgIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOwogICAgfQoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgogICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICAgICogQGdlbmVyYXRlZAogICAgICovCglwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7CiAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGFyY2hpdmVUeXBlRUNsYXNzLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAibmFtZSIsICJhcmNoaXZlXy5fdHlwZSIsCiAgICAgICAgICAgICAia2luZCIsICJlbXB0eSIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRBcmNoaXZlVHlwZV9QYXRoKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImF0dHJpYnV0ZSIsCiAgICAgICAgICAgICAibmFtZSIsICJwYXRoIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGNsYXNzcGF0aEVDbGFzcywgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgIm5hbWUiLCAiQ2xhc3NwYXRoIiwKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnRPbmx5IgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldENsYXNzcGF0aF9Hcm91cCgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJncm91cCIsCiAgICAgICAgICAgICAibmFtZSIsICJncm91cDowIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldENsYXNzcGF0aF9BcmNoaXZlKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAiYXJjaGl2ZSIsCiAgICAgICAgICAgICAiZ3JvdXAiLCAiI2dyb3VwOjAiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0Q2xhc3NwYXRoX0lkKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImF0dHJpYnV0ZSIsCiAgICAgICAgICAgICAibmFtZSIsICJpZCIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRDbGFzc3BhdGhfSXNMaWJyYXJ5KCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImF0dHJpYnV0ZSIsCiAgICAgICAgICAgICAibmFtZSIsICJpc0xpYnJhcnkiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJuYW1lIiwgImpuZGlDb25uZWN0aW9uIiwKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnRPbmx5IgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldEpuZGlDb25uZWN0aW9uX1Byb3ZpZGVyVXJsKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAicHJvdmlkZXJVcmwiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0Sm5kaUNvbm5lY3Rpb25fR3JvdXAoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZ3JvdXAiLAogICAgICAgICAgICAgIm5hbWUiLCAiZ3JvdXA6MSIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRKbmRpQ29ubmVjdGlvbl9KbmRpUHJvcGVydHkoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudCIsCiAgICAgICAgICAgICAibmFtZSIsICJqbmRpUHJvcGVydHkiLAogICAgICAgICAgICAgImdyb3VwIiwgIiNncm91cDoxIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldEpuZGlDb25uZWN0aW9uX0luaXRpYWxDb250ZXh0RmFjdG9yeSgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgImluaXRpYWxDb250ZXh0RmFjdG9yeSIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChqbmRpUHJvcGVydHlFQ2xhc3MsIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJuYW1lIiwgImpuZGlQcm9wZXJ0eSIsCiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50T25seSIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRKbmRpUHJvcGVydHlfTmFtZSgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgIm5hbWUiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0Sm5kaVByb3BlcnR5X1ZhbHVlKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAidmFsdWUiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgIm5hbWUiLCAiTGF1bmNoQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50T25seSIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX01haW5DbGFzcygpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgIm1haW5DbGFzcyIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX1dvcmtpbmdEaXJlY3RvcnkoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudCIsCiAgICAgICAgICAgICAibmFtZSIsICJ3b3JraW5nRGlyZWN0b3J5IgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fUHJvZ3JhbUFyZ3VtZW50cygpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgInByb2dyYW1Bcmd1bWVudHMiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9WbVBhcmFtZXRlcnMoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudCIsCiAgICAgICAgICAgICAibmFtZSIsICJ2bVBhcmFtZXRlcnMiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9DbGFzc3BhdGhSZWZlcmVuY2UoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudCIsCiAgICAgICAgICAgICAibmFtZSIsICJjbGFzc3BhdGhSZWZlcmVuY2UiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAobW9kdWxlRUNsYXNzLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAibmFtZSIsICJNb2R1bGUiLAogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudE9ubHkiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0TW9kdWxlX1R5cGUoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudCIsCiAgICAgICAgICAgICAibmFtZSIsICJ0eXBlIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldE1vZHVsZV9QdWJsaXNoRGlyKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAicHVibGlzaERpciIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAicHVibGlzaGVyUmVmZXJlbmNlIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKHBvcnRFQ2xhc3MsIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJuYW1lIiwgIlBvcnQiLAogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudE9ubHkiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0UG9ydF9ObygpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgIm5vIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldFBvcnRfTmFtZSgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgIm5hbWUiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0UG9ydF9Qcm90b2NvbCgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgInByb3RvY29sIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKHByb2plY3RFQ2xhc3MsIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJuYW1lIiwgIlByb2plY3QiLAogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudE9ubHkiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudCIsCiAgICAgICAgICAgICAibmFtZSIsICJjbGFzc3BhdGhSZWZlcmVuY2UiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAocHJvcGVydHlFQ2xhc3MsIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJuYW1lIiwgIlByb3BlcnR5IiwKICAgICAgICAgICAgICJraW5kIiwgImVtcHR5IgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldFByb3BlcnR5X0NvbnRleHQoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiYXR0cmlidXRlIiwKICAgICAgICAgICAgICJuYW1lIiwgImNvbnRleHQiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0UHJvcGVydHlfRGVmYXVsdCgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJhdHRyaWJ1dGUiLAogICAgICAgICAgICAgIm5hbWUiLCAiZGVmYXVsdCIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRQcm9wZXJ0eV9JZCgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJhdHRyaWJ1dGUiLAogICAgICAgICAgICAgIm5hbWUiLCAiaWQiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0UHJvcGVydHlfTGFiZWwoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiYXR0cmlidXRlIiwKICAgICAgICAgICAgICJuYW1lIiwgImxhYmVsIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldFByb3BlcnR5X1R5cGUoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiYXR0cmlidXRlIiwKICAgICAgICAgICAgICJuYW1lIiwgInR5cGUiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAocHVibGlzaGVyRUNsYXNzLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAibmFtZSIsICJQdWJsaXNoZXIiLAogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudE9ubHkiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0UHVibGlzaGVyX0dyb3VwKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImdyb3VwIiwKICAgICAgICAgICAgICJuYW1lIiwgImdyb3VwOjAiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0UHVibGlzaGVyX1B1Ymxpc2hlcmRhdGEoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudCIsCiAgICAgICAgICAgICAibmFtZSIsICJwdWJsaXNoZXJkYXRhIiwKICAgICAgICAgICAgICJncm91cCIsICIjZ3JvdXA6MCIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRQdWJsaXNoZXJfSWQoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiYXR0cmlidXRlIiwKICAgICAgICAgICAgICJuYW1lIiwgImlkIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKHB1Ymxpc2hlckRhdGFFQ2xhc3MsIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJuYW1lIiwgIlB1Ymxpc2hlckRhdGEiLAogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudE9ubHkiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0UHVibGlzaGVyRGF0YV9EYXRhbmFtZSgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgImRhdGFuYW1lIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAiZGF0YXZhbHVlIgogICAgICAgICAgIH0pOwkJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChzZXJ2ZXJSdW50aW1lRUNsYXNzLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAibmFtZSIsICJTZXJ2ZXJSdW50aW1lIiwKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnRPbmx5IgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldFNlcnZlclJ1bnRpbWVfR3JvdXAoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZ3JvdXAiLAogICAgICAgICAgICAgIm5hbWUiLCAiZ3JvdXA6MCIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAicHJvcGVydHkiLAogICAgICAgICAgICAgImdyb3VwIiwgIiNncm91cDowIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldFNlcnZlclJ1bnRpbWVfR3JvdXAxKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImdyb3VwIiwKICAgICAgICAgICAgICJuYW1lIiwgImdyb3VwOjIiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0U2VydmVyUnVudGltZV9Qb3J0KCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAicG9ydCIsCiAgICAgICAgICAgICAiZ3JvdXAiLCAiI2dyb3VwOjIiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0U2VydmVyUnVudGltZV9Hcm91cDIoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZ3JvdXAiLAogICAgICAgICAgICAgIm5hbWUiLCAiZ3JvdXA6NCIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgIm1vZHVsZSIsCiAgICAgICAgICAgICAiZ3JvdXAiLCAiI2dyb3VwOjQiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0U2VydmVyUnVudGltZV9Qcm9qZWN0KCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAicHJvamVjdCIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAic3RhcnQiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0U2VydmVyUnVudGltZV9TdG9wKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAic3RvcCIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJncm91cCIsCiAgICAgICAgICAgICAibmFtZSIsICJncm91cDo5IgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImVsZW1lbnQiLAogICAgICAgICAgICAgIm5hbWUiLCAicHVibGlzaGVyIiwKICAgICAgICAgICAgICJncm91cCIsICIjZ3JvdXA6OSIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwNCgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJncm91cCIsCiAgICAgICAgICAgICAibmFtZSIsICJncm91cDoxMSIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpLCAKICAgICAgICAgICBzb3VyY2UsIAogICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAia2luZCIsICJlbGVtZW50IiwKICAgICAgICAgICAgICJuYW1lIiwgImNsYXNzcGF0aCIsCiAgICAgICAgICAgICAiZ3JvdXAiLCAiI2dyb3VwOjExIgogICAgICAgICAgIH0pOwkJCiAgICAgICAgYWRkQW5ub3RhdGlvbgogICAgICAgICAgKGdldFNlcnZlclJ1bnRpbWVfSm5kaUNvbm5lY3Rpb24oKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiZWxlbWVudCIsCiAgICAgICAgICAgICAibmFtZSIsICJqbmRpQ29ubmVjdGlvbiIKICAgICAgICAgICB9KTsJCQogICAgICAgIGFkZEFubm90YXRpb24KICAgICAgICAgIChnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKSwgCiAgICAgICAgICAgc291cmNlLCAKICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImtpbmQiLCAiYXR0cmlidXRlIiwKICAgICAgICAgICAgICJuYW1lIiwgIm5hbWUiCiAgICAgICAgICAgfSk7CQkKICAgICAgICBhZGRBbm5vdGF0aW9uCiAgICAgICAgICAoZ2V0U2VydmVyUnVudGltZV9WZXJzaW9uKCksIAogICAgICAgICAgIHNvdXJjZSwgCiAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJraW5kIiwgImF0dHJpYnV0ZSIsCiAgICAgICAgICAgICAibmFtZSIsICJ2ZXJzaW9uIgogICAgICAgICAgIH0pOwogICAgfQoKfSAvL1NlcnZlclR5cGVQYWNrYWdlSW1wbAo=